package main

import "fmt"

// Say 抽象接口
type Say interface {
	Say()
}

// Proxy 代理类
type Proxy struct {
	Say
}

// proxy Method
func (p *Proxy) ProxyMethod() {
	fmt.Println("do proxy")
	p.Say.Say()
	fmt.Println("do proxy")
}

// 被代理类
type My struct {
	Name string
}

func (m My) Say() {
	fmt.Println(m.Name + ": say hello")
}

func main() {
	my := My{
		Name: "gaga",
	}
	proxy := Proxy{my}
	proxy.ProxyMethod()
}
